React高级
propTypes和DefaultProps
propTypes:组件要接受外部传过来的值,进行类型校验。验证传值
DefaultProps:若父组件未向子组件传值,定义属性默认值。设置默认值
https://reactjs.org/docs/typechecking-with-proptypes.html
1 | import PropTypes from 'prop-types'; |
props、state、render函数关系
当组件的state或者props发生改变的时候,render函数就会重新执行
当父组件的render函数被运行时,他的子组件的render都被重新运行一次
虚拟DOM
1 | //真实DOM - 全部替换 |
流程:JSX —> createElement—>虚拟DOM(JS对象) —> 真实的DOM
1 | return <div>item</div> |
虚拟DOM的diff算法
diff算法:比对原始虚拟DOM和新的虚拟DOM的差异
虚拟DOM时候会被比对 —> 什么时候数据改变 —> 调用setState
1.setState设计成异步函数的原因?
假设连续调用三次setState,且三次调用的时间间隔非常小。react把三次,合并为一次,只做一次虚拟DOM比对,更新一次DOM。节省了两次DOM比对和更新的时间,性能提升。
diff算法:
- 同级比对:算法简单,比对算法的速度快。同层比较,若有差异,本层及下层重新渲染,
- key值比对:提高了比对的性能。
- 需要保证:原虚拟DOM树和新虚拟DOM树上的key值一致。
- 因此不能使用index做key值,删除之后index会改变,key值不稳定
- key值要稳定,用item做key值
React中ref的使用
用处:帮助我们直接获取 DOM元素
一般情况:然而并不推荐直接操作DOM元素,因为react是操纵数据
1 | {/*构建ref的引用;引用名为:this.input;指向input对应的dom节点*/} |
ref和setState使用需要注意的地方:
DOM的获取并不及时,因为setState是异步的。如果希望页面更新后获取DOM,将获取DOM的语法放在setState第二个参数中,他是一个回调函数。
1 | // 1.2点击add,增加一项数据 |
React生命周期函数
生命周期函数:在某一时刻,组件会自动调用的函数
render:setState
初始化initialization
挂载mounting
更新updation
去除unmounting
1 | //2组件即将被挂载到页面的时刻执行 |
1 | // 3(1)当组件从父组件接收参数;(2)父组件的render执行了,该生命周期函数会执行 |
React生命周期函数使用场景
性能优化:借助shouldComponentUpdate
原因:提高react组件性能,避免无谓的组件render渲染
1 | // 避免一个组件做无谓的render操作 |
发送ajax请求:默认放在componentDidMount
原因:ajax只需要请求1次,需要在渲染前获取数据
场景:使用ajax异步请求的方式,从我的一个接口上,请求一个远程的todolist数据,将远程数据加载到本地,渲染到页面上。
1 | // npm、或者初始化脚本方法安装yarn |
1 | // 约定:ajax放在componentDidMount中 |
使用Charles实现本地数据mock
Charles:中间代理服务器,可以抓取浏览器的请求,可以使用map local模拟本地前端接口。
模拟一个接口,ajax请求获取接口中真正的结果,改变页面的内容。
1 | componentDidMount(){ |
CSS3的过渡动画和动画
监听state里show的值,根据值在div元素中动态添加css样式className
1 | <div className={this.state.show?'show':'hide'}>hello</div> |
1 | /*过渡动画*/ |
react-transition-group实现动画
文档:https://reactcommunity.org/react-transition-group/css-transition
安装:yarn add react-transition-group
1 | //不需要样式的添加和删除 |
性能优化
作用域修改放在constructor构造函数内,保证作用域绑定操作只执行一次 + 避免子组件的无谓渲染。
this.handleClick = this.handleClick.bind(this);
react底层setState性能提升机制,使用异步函数:多次数据改变结合成一次来做,降低虚拟DOM频率
- react底层虚拟DOM,同层比对+使用key值比对,提升虚拟DOM比对速度
- 借助shouldComponentUpdate,提高react组件性能,避免无谓的组件render渲染